package cc.mrbird.febs.buss.util;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import java.io.*;

/**
 * @description:
 * @program: ConvertUtil
 * @author: ZHJ
 * @create: 2020-12-01 17:46
 */

public class ConvertUtil {
        private static final int wdFormatPDF = 17;//word保存为pdf的格式宏的值是17

        public static void wToPdfChange(String wordFile, String pdfFile) {//wordFile word 的路径  //pdfFile pdf 的路径

            ActiveXComponent app = null;
            Dispatch doc = null;
            try {
                app = new ActiveXComponent("Word.Application");
                /**
                 * app.setProperty("Visible", new Variant(false));
                 * 设置word不可见,默认就是不可见的，如果设置可见就是会打开一个word文档
                 */
                //app.setProperty("Visible", new Variant(false));
                Dispatch docs = app.getProperty("Documents").toDispatch();
                doc = Dispatch.call(docs, "Open", wordFile).toDispatch();

                File target = new File(pdfFile);
                // 如果文件存在的话，需要先删除，否则会直接报错
                if (target.exists()) {
                    target.delete();
                }
                Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[]{
                        pdfFile, new Variant(wdFormatPDF)}, new int[1]);

            } catch (Exception e) {
                System.out.println("========Error:文档转换失败：" + e.getMessage());
            } finally {
                //关闭文档
                Dispatch.call(doc, "Close", false);
                if (app != null)
                    app.invoke("Quit", new Variant[]{});
            }
            // 如果没有这句话,winword.exe进程将不会关闭
            ComThread.Release();
        }

    /**
     *
     * @param fileName word文档名称 带后缀名 例： 9b8c906e-a335-43dc-a687-893ca137734f.docx
     * @param wordPath word文档的路径 不带后缀名 例： D://testPdf
     * @param pdfPath 生成的pdf的路径 不带后缀名 例： D://testPdf2
     *  把D://testPdf路径下的9b8c906e-a335-43dc-a687-893ca137734f.docx文件转化为9b8c906e-a335-43dc-a687-893ca137734f.pdf并存放到D://testPdf2
     * @return
     */
    public static boolean word2Pdf(String fileName,String wordPath,String pdfPath){
        String inputFile=wordPath+"\\"+fileName;
        String pdfFile=pdfPath+"\\"+getFileRealName(fileName)+".pdf";
        System.out.println(pdfFile);
        String suffix =  getFileSufix(inputFile);
        File file = new File(inputFile);
        if(!file.exists()){
            System.out.println(fileName+"文件不存在！");
        }
        if(suffix.equals("doc")||suffix.equals("docx")){
            try{
                //打开word应用程序
                ActiveXComponent app = new ActiveXComponent("Word.Application");
                //设置word不可见
                app.setProperty("Visible", false);
                //获得word中所有打开的文档,返回Documents对象
                Dispatch docs = app.getProperty("Documents").toDispatch();
                //调用Documents对象中Open方法打开文档，并返回打开的文档对象Document
                Dispatch doc = Dispatch.call(docs,
                        "Open",
                        inputFile,
                        false,
                        true
                ).toDispatch();
                Dispatch.call(doc,
                        "ExportAsFixedFormat",
                        pdfFile,
                        17		//word保存为pdf格式宏，值为17
                );
                //关闭文档
                Dispatch.call(doc, "Close",false);
                //关闭word应用程序
                app.invoke("Quit", 0);
            }catch(Exception e){
                e.printStackTrace();
                System.out.println("pdf转换异常!");
                return false;
            }
            System.out.println("文档："+fileName+"转换为pdf成功");
            return true;
        }else{
            System.out.println("文件格式不支持转换!");
            return false;
        }
    }

    public static String getFileSufix(String fileName){
        int splitIndex = fileName.lastIndexOf(".");
        return fileName.substring(splitIndex + 1);
    }

    public static String getFileRealName(String fileName){
        int splitIndex = fileName.lastIndexOf(".");
        return fileName.substring(0,splitIndex);
    }

    public static void main(String[] args){
        ConvertUtil.word2Pdf("9b8c906e-a335-43dc-a687-893ca137734f.docx", "D://testPdf", "D://testPdf");
    }
}
